package java_thinking.unit_15._15_10;

import java_thinking.unit_15.Holder;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description :   创建一个泛型方法，它接受一个Holder<List<?>>参数，对于这个Holder以及
 *                  这个List，确定哪些方法是可以调用的，哪些方法是不可以调用的，用List<Holder<?>>
 *                  作为参数重复这个练习
 *
 *                  这个例子说明：容器的类型，与容器持有的类型的区别*****其实不是这样
 * @author: cww
 * @DateTime: 2019-04-07 10:49
 */

public class E29 {
    static void f1(Holder<List<?>> holder) {
        List<?> list = holder.get();
        // Compile errors:
        // list.add(1);
        // list.add(new Object());
        Integer i = (Integer)list.get(0);
        System.out.println(i);
        System.out.println(list.contains(i));
        System.out.println(list.remove(i));
        holder.set(new ArrayList<Float>());
        System.out.println(holder.equals(list));
        System.out.println("*******************************************");
    }
    static void f2(List<Holder<?>> list) {
        Holder<?> holder = (Holder<?>)list.get(0);
        System.out.println(holder.equals(Integer.valueOf(1)));
        // Compile error:
//         holder.set(new Integer(2));
        System.out.println(holder.get());
        list.add(new Holder<Float>(1.0F));
        System.out.println(list.get(1).get());
        list.remove(0);
        System.out.println(list.size());
    }

    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(1);
        f1(new Holder<List<?>>(list1));

        List<Holder<?>> list2 = new ArrayList<Holder<?>>();
        list2.add(new Holder<Integer>(1));
        f2(list2);
    }
}
